【数据结构/C++】线性表_单链表的基本操作

image.png

image.png

image.png

#include <iostream>
using namespace std;
// 2. 单链表
// ElemType 的定义
typedef int ElemType;
typedef struct LNode
{ElemType data;struct LNode *next;
} LNode, *LinkList;
// 初始化单链表
bool InitList(LinkList &L)
{L = (LNode *)malloc(sizeof(LNode));// 内存不足,分配失败if (L == NULL){return false;}L->next = NULL;return true;
}
// 在第 i 个位置插入元素
bool ListInsert(LinkList &L, int i, ElemType e)
{if (i < 1){return false;}// 指针 p 指向当前扫描到的结点LNode *p = L;// 当前p指向第几个结点int j = 0;// L 指向头结点,头结点是第 0 个结点p = L;while (p != NULL && j < i - 1){p = p->next;j++;}// i 不合法if (p == NULL){return false;}LNode *s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}
// 删除第 i 个元素
bool ListDelete(LinkList &L, int i, ElemType &e)
{if (i < 1){return false;}LNode *p = L;int j = 0;p = L;while (p != NULL && j < i - 1){p = p->next;j++;}if (p == NULL){return false;}if (p->next == NULL){return false;}// q 指向被删除的结点LNode *q = p->next;// e 来接收返回的删除值e = q->data;p->next = q->next;free(q);return true;
}
// 遍历单链表
void ListTraverse(LinkList L)
{LNode *p = L->next;while (p != NULL){cout << p->data << " ";p = p->next;}cout << endl;
}
// 将单链表逆置
void ReverseList(LinkList &L)
{// LNode *p = L->next;LNode *q = NULL;LNode *r = NULL;L->next = NULL;while (p != NULL){// 头插法(相当于原单链表这个队列不断取出每一个元素向新的链表头插入)// q 指向新链表的头// p 指向正在操作的某个结点// r 暂存下一个将要操作的结点q = L->next;L->next = p;r = p->next;p->next = q;p = r;}
}int main()
{LinkList L;InitList(L);for (int i = 1; i <= 10; i++){ListInsert(L, i, i);}ListTraverse(L);ReverseList(L);ListTraverse(L);ReverseList(L);ElemType e;ListDelete(L, 3, e);ListTraverse(L);ListDelete(L, 1, e);ListTraverse(L);return 0;
}